package logica_de_negocio;

import java.util.HashSet;

import logica_de_datos.GestorBD;
import comun.CapituloVistaNoSi;
import comun.SigueSerie;

public class GestorSigueSerie {

	private HashSet<SigueSerie> gss;
	final GestorBD objConversor = GestorBD.getInstance();

	public GestorSigueSerie() {
		gss = new HashSet<SigueSerie>();
	}

	public void cargarDatos() throws ClassNotFoundException {

		objConversor.connect();
		gss = objConversor.listarSigueSerie();
		objConversor.disconnect();

	}

	public boolean addSigueSerie(SigueSerie sSerie) throws excepAnadirDupli,
			FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		cargarDatos();

		if (gss.contains(sSerie)) {
			excepAnadirDupli dupli = new excepAnadirDupli();
			dupli.setDes("La serie con id " + sSerie.getId_s()
					+ "  ya se esta siguiendo");
			throw dupli;
		} else {
			comprovarSigueSerie(sSerie);
			objConversor.connect();
			objConversor.addSigueSerie(sSerie);
			objConversor.disconnect();

		}
		cargarDatos();
		return gss.contains(sSerie);
	}

	private void comprovarSigueSerie(SigueSerie sSerie)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		/**
		 * Comprueba que tanto en id del usuario como el del capitulo esten en
		 * la base de datos
		 */

		boolean estaC = false;
		gestorSerie gs = new gestorSerie();
		if (gs.isId(sSerie.getId_s())) {
			estaC = true;
		}
		boolean estaU = false;
		gestorUsuario gu = new gestorUsuario();
		if (gu.isId(sSerie.getId_u())) {
			estaU = true;
		}
		if ((estaC == false) || (estaU == false)) {
			FaltanDatosEnLaBaseDeDatos ex = new FaltanDatosEnLaBaseDeDatos();
			if (estaC == false) {
				ex.setFalta("Falta el id de la serie ");
			}
			if ((estaU == false) && (estaC == false)) {
				ex.setFalta(ex.getFalta() + " y ");
			}
			if (estaU == false) {
				if (ex.getFalta() == null) {
					ex.setFalta("Falta el id del usuario ");
				} else {
					ex.setFalta(ex.getFalta() + "falta el id del usuario ");
				}

			}
			ex.setFalta(ex.getFalta() + "en la Base De datos");
			throw ex;
		}
	}

	/**
	 * Dejar de seguir un serie ne concreto por un usuario en concreto.
	 * 
	 * @param sSerie
	 *            -> sSereie que se elimina de la base de datos.
	 * @return true si se borrar con exito.
	 * @throws ClassNotFoundException Se produce cuando no existe la base de datos
	 */
	public boolean deleteSigueSerie(SigueSerie sSerie) throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (gss.contains(sSerie)) {
			try {
				objConversor.connect();
				objConversor.deleteSigueSerie(sSerie.getId_u(),
						sSerie.getId_s());
				dev = true;
				objConversor.disconnect();
			} catch (ClassNotFoundException e) {
			}
		}
		return dev;
	}

	/**
	 * Dejar de seguir todas las series por parte de un usuario.
	 * 
	 * @param id_u
	 *            -> Id del usuario que se quiere que no se sigan ya las series.
	 * @return True si el borrado se relaizada corectamente sino false.
	 * @throws ClassNotFoundException Se produce cuando no existe la base de datos
	 */
	public boolean deleteAllSigueSerieFromId_u(int id_u) throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (isId_u(id_u)) {

			try {
				objConversor.connect();

				objConversor.deleteSigueSerieAllFromId_u(id_u);
				dev = true;

				objConversor.disconnect();
			} catch (ClassNotFoundException e) {
			}
		}
		return dev;
	}

	/**
	 * Que todos los usuarios dejen de seguir una serie en concreto.
	 * 
	 * @param id_s
	 *            -> Id de la serie que se tiene que dejar de seguir.
	 * @return True si se consige correctamente.False sino.
	 * @throws ClassNotFoundException Se produce cuando no existe la base de datos
	 */
	public boolean deleteAllSigueSerieFromId_s(int id_s) throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (isId_s(id_s)) {
			try {
				objConversor.connect();
				objConversor.deleteSigueSerieAllFromId_s(id_s);
				dev = true;
				objConversor.disconnect();
			} catch (ClassNotFoundException e) {
			}
		}
		return dev;
	}

	public boolean isId_s(int id_s) throws ClassNotFoundException {

		boolean dev = false;

		cargarDatos();

		for (SigueSerie ss : gss) {
			if (ss.getId_s() == id_s) {
				dev = true;
			}
		}
		return dev;
	}

	public boolean isId_u(int id_u) throws ClassNotFoundException {
		boolean dev = false;

		cargarDatos();

		for (SigueSerie ss : gss) {
			if (ss.getId_u() == id_u) {
				dev = true;
			}
		}
		return dev;
	}

	public SigueSerie getSigueSerie(int id_u, int id_s)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		cargarDatos();
		SigueSerie dev = null;
		for (SigueSerie ss : gss) {
			if (ss.getId_s() == id_s) {
				if (ss.getId_u() == id_u) {
					dev = ss;
				}
			}
		}

		if (dev == null) {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("Esta serie nos es seguida por el usuario con id "
					+ id_u);
			throw f;
		}

		return dev;
	}

	public int id_sMasSeguida() throws ClassNotFoundException {

		cargarDatos();
		int pos = 0;
		int[][] vecesId_s = new int[gss.size()][2]; // id_s veces
		for (SigueSerie ss : gss) {
			boolean esta = false;
			for (int i = 0; i < pos; i++) {

				if (vecesId_s[i][0] == ss.getId_s()) {
					vecesId_s[i][1]++;
				}

			}
			if (esta == false) {
				vecesId_s[pos][0] = ss.getId_s();
				vecesId_s[pos][1]++;
				pos++;
			}
		}

		int dev = vecesId_s[0][0];
		int max = vecesId_s[0][1];

		for (int i = 0; i < pos; i++) {

			if (max <= vecesId_s[i][1]) {
				dev = vecesId_s[i][0];
			}
		}

		return dev;
	}

	public boolean estaVacia() throws ClassNotFoundException {
		boolean dev = false;
		cargarDatos();
		dev = gss.isEmpty();
		return dev;
	}

	public boolean laSigue(int id_s, int id_u) {

		boolean dev = false;
		for (SigueSerie ss : gss) {
			if (ss.getId_s() == id_s) {
				if (ss.getId_u() == id_u) {
					dev = true;
				}
			}
		}
		return dev;
	}

	public void avisar(int id_s, int id_c) throws ClassNotFoundException {

		cargarDatos();
		gestorCapituloVistaNoSi gcvns = new gestorCapituloVistaNoSi();
		for (SigueSerie ss : gss) {
			if (ss.getId_s() == id_s) {
				try {
					gcvns.addCapituloVistaNoSi(new CapituloVistaNoSi(ss
							.getId_u(), id_c, false));
				} catch (excepAnadirDupli e) {
					// NO ES POSIBLE PORQUE SE ACABA DE INTRODUCIR
				} catch (FaltanDatosEnLaBaseDeDatos e) {
					// NO HACER NADA
				}
			}
		}
	}
}